# 广播机制
import numpy as np
# 标量运算
a = np.arange(1, 7).reshape(2, 3)
# [[1 2 3]
#  [4 5 6]]
print(a)
# 和标量运算
b = a + 10
print(b)

# 和数组运算
c = a + np.array([1, 2, 3])
print(c)

# 和二维数组运算 
d = np.array([[10], 
              [20]])
print(d.shape) # (2, 1)
f = a + d
print(f)

print("------------归一化----------------")
# 归一化
# 按行归一化
# 创建一个二维数组
data = np.array([[11, 22, 13], [34, 25, 16]])

# 计算每列的平均值和标准差
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)

# 归一化数据
normalized_data = (data - mean) / std
print("Mean:", mean)
print("Std:", std)
print("Normalized data:\n", normalized_data)

# 矩阵乘法
# 创建两个二维数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# 矩阵乘法
c = np.dot(a, b)
print("Matrix multiplication:\n", c)
d = a @ b
print("Matrix multiplication:\n", d)

# 矩阵求逆运算
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])

# 求逆矩阵
b = np.linalg.inv(a)
print("Inverse matrix:\n", b)
# 验证
c = np.dot(a, b)
print("Verification:\n", c)

# 行列式计算
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])

# 计算行列式
det = np.linalg.det(a)
print("Determinant:", det)

# 特征值和特征向量
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(a)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)

# 奇异值分解
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])

# 奇异值分解
u, s, vh = np.linalg.svd(a)
print("U:\n", u)
print("Singular values:", s)
print("VH:\n", vh)

# 线性方程求解
# 创建一个矩阵和一个向量
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])

# 求解线性方程
x = np.linalg.solve(A, b)
print("Solution:\n", x) 

#  PCA分解
import numpy as np

# 定义数据集
data = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0]])

# 1. 中心化数据
mean = np.mean(data, axis=0)
centered_data = data - mean

# 2. 计算协方差矩阵
cov_matrix = np.cov(centered_data, rowvar=False)

# 3. 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# 4. 选择主成分
sorted_indices = np.argsort(eigenvalues)[::-1]
sorted_eigenvectors = eigenvectors[:, sorted_indices]
principal_components = sorted_eigenvectors[:, :1]

# 5. 降维
reduced_data = centered_data @ principal_components
print("Reduced data:\n", reduced_data)

# 排序
import numpy as np  

a = np.array([[3,7],[9,1]])  
print ('我们的数组是：')
print (a)

print ('调用 sort() 函数：')
print (np.sort(a)) # 升序排序

print ('按列排序：')
print (np.sort(a, axis =  0))
print ('\n')


# 在 sort 函数中排序字段 
dt = np.dtype([('name',  'S10'),('age',  int)]) 
a = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)  
print ('我们的数组是：')
print (a)
print ('\n')
print ('按 age 排序：')
# 按age降序排序
print (np.sort(a, order =  'age')[::-1])

